<!DOCTYPE html>
<title>Custom Elements: adopt node</title>
<link rel="help" href="https://dom.spec.whatwg.org/#concept-node-adopt">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="resources/custom-elements-helpers.js"></script>
<body>
<script>
'use strict'

// 3.2 For each inclusiveDescendant in node’s shadow-including inclusive descendants that is a custom
// element, enqueue a custom element callback reaction with inclusiveDescendant,
// callback name "adoptedCallback", and an empty argument list.
promise_test((t) => {
  return Promise.all([
    create_window_in_test(t),
    create_window_in_test(t)])
    .then(([w1, w2]) => {
      let invocations = [];
      class X extends w1.HTMLElement {
        adoptedCallback() { invocations.push(['adopted', this, arguments]); }
      }
      w1.customElements.define('a-a', X);
      let a = w1.document.createElement('a-a');
      w2.document.adoptNode(a);
      assert_array_equals_callback_invocations(invocations, [ ['adopted', a, [w1.document, w2.document]] ]);
    });
}, 'adopting a custom element to the different document should enqueue an adoptedCallback reaction');

// 3.3 For each inclusiveDescendant in node’s shadow-including inclusive descendants, in
// shadow-including tree order, run the adopting steps with inclusiveDescendant and oldDocument.
promise_test((t) => {
  return Promise.all([
    create_window_in_test(t),
    create_window_in_test(t)])
    .then(([w1, w2]) => {
      w1.document.body.innerHTML = `
      <a-a id="a">
        <p>
          <a-a id="b"></a-a>
          <a-a id="c"></a-a>
        </p>
        <a-a id="d"></a-a>
      </a-a>`;
      let invocations = [];
      class X extends w1.HTMLElement {
        adoptedCallback() { invocations.push(this); }
      }
      w1.customElements.define('a-a', X);
      let a = w1.document.getElementById("a");
      w2.document.adoptNode(a);
      assert_array_equals(['a', 'b', 'c', 'd'], invocations.map((e) => e.id),
                      'four elements should have been removed in doc order');
    });
}, 'shadow-including inclusive descendants should be adopted in shadow-including tree order');
</script>
</body>
